const { blog_roles, blog_menus } = require('@/model'); // 引入用户模型
const { Op } = require('sequelize'); // 引入操作符
class RoleService {
  async saveRole({permissions,...params}) {
    // 使用事务保证数据一致性
    const role = await blog_roles.upsert(params)
    const currentRole = await blog_roles.findByPk(params.id)
    await currentRole.setMenus(permissions)
    // console.log('当前角色',currentRole)
    // await currentRole.removePermissions(await currentRole.getPermissions())
    // if(permissions && Array.isArray(permissions) && permissions.length) {
    //   await currentRole.addPermissions(permissions)
    // }
    return role


    // const role = await blog_roles.upsert(params)
    // // 清理旧权限
    // await blog_roles.removePermissions(role.id, { [Op.not]: permissions })
    // // 添加新权限
    // if (permissions && permissions.length) {
    //   await blog_roles.addPermissions(role.id, permissions)
    // }
    // return role;
  }

  async deleteRole(id) {
    const role = await blog_roles.destroy({
      where: {
        id
      }
    });
    return role;
  }

  async getRoleList(params) {
    const { pageIndex = 1, pageSize = 10, ...where } = params || {};
    const offset = (pageIndex - 1) * pageSize;
    const roles = await blog_roles.findAndCountAll({
      where,
      include:[{
        model:blog_menus,
        as:'menus'
      }],
      offset,
      limit: Number(pageSize),
    });
    // 使用 forEach 替代 map，因为我们不需要创建新数组
    roles.rows.forEach(item => {
      // 确保访问的是 dataValues 属性（Sequelize 模型实例）
      const data = item.dataValues || item;
      
      // 添加空值检查，防止出现 undefined 错误
      if (data.menus && Array.isArray(data.menus)) {
        // 提取菜单 ID 到 permissions 数组
        data.permissions = data.menus.map(menu => menu.id);
        // 删除 menus 属性
        delete data.menus;
      } else {
        // 如果没有菜单，设置为空数组
        data.permissions = [];
      }
    });
    return {
      list: roles.rows,
      total: roles.count,
      page: Number(pageIndex),
      pageSize: Number(pageSize)
    };
  }
}

module.exports = new RoleService();